/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tbp.model.domain;

import br.com.tbp.utils.DateUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Diego Freire
 */
public class Pedido {

    private long id;
    private Date data;
    private Consultor consultor;
    private Empresa empresa;
    private Supervisor supervisor;
    private Boc boc;
    private List<ItemDePedido> lista_itens_pedido;
    private List<SituacaoInterna> lista_situacoes_internas;
    private List<SituacaoExterna> lista_situacoes_externas;
    private StatusPedido situacaoExterna;
    private boolean finalizado;
    private Date dataDeFinalizacao;
    private int tempoDecorridoEmDias;
    private BocInfo bocInfo;

    public Pedido() {
        this.id = 0;
        this.data = new Date();
        this.lista_itens_pedido = new ArrayList<ItemDePedido>();
        this.lista_situacoes_internas = new ArrayList<SituacaoInterna>();
        this.lista_situacoes_externas = new ArrayList<SituacaoExterna>();
        this.bocInfo = new BocInfo(this);
    }

    public Pedido(long id) {
        this.id = id;
        this.lista_itens_pedido = new ArrayList<ItemDePedido>();
        this.lista_situacoes_internas = new ArrayList<SituacaoInterna>();
        this.lista_situacoes_externas = new ArrayList<SituacaoExterna>();
        this.bocInfo = new BocInfo(this);
    }

    public Consultor getConsultor() {
        return consultor;
    }

    public Date getData() {
        return data;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }

    public List<ItemDePedido> getListaDeItensDoPedido() {
        return lista_itens_pedido;
    }

    public List<SituacaoExterna> getListaDeSituacoesExternas() {
        return lista_situacoes_externas;
    }

    public List<SituacaoInterna> getListaDeSituacoesInternas() {
        return lista_situacoes_internas;
    }

    public int qtde_de_itens() {
        int qtde = 0;
        for (ItemDePedido item : lista_itens_pedido) {
            if (item != null) {
                qtde += item.getQtde();
            }
        }
        return qtde;
    }

    public int qtde_de_produtos() {
        return lista_itens_pedido.size();
    }

    public void alterarQuantidadeDoItem(ItemDePedido item, int nova_qtde) {
        int index = lista_itens_pedido.indexOf(item);
        if (index != -1) {
            item.setQuantidade(nova_qtde);
            lista_itens_pedido.set(index, item);
        }
    }

    public void addItem(ItemDePedido item) {
        lista_itens_pedido.add(item);
    }

    public ItemDePedido getItem(int index) {
        if (index >= 0) {
            return lista_itens_pedido.get(index);
        }
        return null;
    }

    public boolean contemItem(ItemDePedido item) {
        return lista_itens_pedido.contains(item);
    }

    public void limparItens() {
        lista_itens_pedido.clear();
    }

    public void limparSituacoesExternas() {
        lista_situacoes_externas.clear();
    }

    public void limparSituacoesInternas() {
        lista_situacoes_internas.clear();
    }

    public boolean retiraItem(ItemDePedido item) {
        return lista_itens_pedido.remove(item);
    }

    public void setData(Date data) {
        this.data = data;
    }

    public void setConsultor(Consultor consultor) {
        this.consultor = consultor;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public void addSituacaoExternaNova(SituacaoExterna item) {
        for (SituacaoExterna s : lista_situacoes_externas) {
            s.setAtual(false);
        }
        lista_situacoes_externas.add(item);
        this.situacaoExterna = item.getSituacao();
    }

    public void addSituacaoExternaAntiga(SituacaoExterna item) {
        lista_situacoes_externas.add(item);
        if (item.isAtual()) {
            this.situacaoExterna = item.getSituacao();
        }
    }

    public int totalDeSituacoesExternas() {
        return lista_situacoes_externas.size();
    }

    public SituacaoExterna getSituacaoExterna(int index) {
        if (index >= 0) {
            return lista_situacoes_externas.get(index);
        }
        return null;
    }

    public boolean removeSituacaoExterna(SituacaoExterna item) {
        int index = lista_situacoes_externas.indexOf(item);
        if (index > 0) {
            SituacaoExterna situacao = lista_situacoes_externas.get(index - 1);
            if (situacao != null) {
                situacao.setAtual(true);
            }
        }
        return lista_situacoes_externas.remove(item);
    }

    public StatusPedido getSituacaoExternaAtual() {
        return situacaoExterna;
    }

    public void setSituacaoExternaAtual(StatusPedido s) {
        this.situacaoExterna = s;
    }

    public void limpaQuantidadesDosItens() {
        for (ItemDePedido item : lista_itens_pedido) {
            if (item != null) {
                item.setQuantidade(0);
            }
        }
    }

    public Boc getBoc() {
        return boc;
    }

    public void setBoc(Boc boc) {
        this.boc = boc;
    }

    public Supervisor getSupervisor() {
        return supervisor;
    }

    public void setSupervisor(Supervisor supervisor) {
        this.supervisor = supervisor;
    }

    public void atualizarSituacaoExterna(SituacaoExterna s) {
        int index = lista_situacoes_externas.indexOf(s);
        if (index != -1) {
            lista_situacoes_externas.set(index, s);
        }
    }

    public SituacaoInterna descobreSituacaoInternaAtual() {
        for (SituacaoInterna s : lista_situacoes_internas) {
            if (s.isAtual()) {
                return s;
            }
        }
        return null;
    }

    public void addSituacaoInternaNova(SituacaoInterna s) {
        SituacaoInterna situacaoAnterior = this.descobreSituacaoInternaAtual();
        if (situacaoAnterior != null) {
            situacaoAnterior.finaliza();
        }
        this.lista_situacoes_internas.add(s);
    }

    public void addSituacaoInternaAntiga(SituacaoInterna s) {
        this.lista_situacoes_internas.add(s);
    }

    public SituacaoInterna getSituacaoInterna(int index) {
        if (index >= 0) {
            return lista_situacoes_internas.get(index);
        }
        return null;
    }

    public boolean removeSituacaoInterna(SituacaoInterna item) {
        int index = lista_situacoes_internas.indexOf(item);
        if (index > 0) {
            SituacaoInterna situacao = lista_situacoes_internas.get(index - 1);
            if (situacao != null) {
                situacao.setAtual(true);
            }
        }
        return lista_situacoes_internas.remove(item);
    }

    public int totalDeSituacoesInternas() {
        return lista_situacoes_internas.size();
    }

    public String calculaTempoDecorrido() {
        int dias = 0;
        if (isFinalizado()) {
            dias = DateUtils.diferencaEmDias(data, dataDeFinalizacao);
        } else {
            dias = DateUtils.diferencaEmDias(data, new Date());
        }
        this.tempoDecorridoEmDias = dias;
        return dias + "d";
    }

    public Date getDataDeFinalizacao() {
        return dataDeFinalizacao;
    }

    public void setDataDeFinalizacao(Date d) {
        this.dataDeFinalizacao = d;
    }

    public boolean isFinalizado() {
        return finalizado;
    }

    public void setFinalizado(boolean finalizado) {
        this.finalizado = finalizado;
    }

    public void atualizarSituacaoInterna(SituacaoInterna s) {
        int index = lista_situacoes_internas.indexOf(s);
        if (index != -1) {
            lista_situacoes_internas.set(index, s);
        }
    }

    public void finaliza(Date finalizado) {
        this.setFinalizado(true);
        this.setDataDeFinalizacao(finalizado);
        this.calculaTempoDecorrido();

        SituacaoInterna s = this.descobreSituacaoInternaAtual();
        if (s != null) {
            s.finaliza();
        }
    }

    public int getTempoDecorridoEmDias() {
        return tempoDecorridoEmDias;
    }

    public BocInfo getBocInfo() {
        return bocInfo;
    }

    public void setBocInfo(BocInfo bocInfo) {
        this.bocInfo = bocInfo;
    }
}
